package io.jee.medusa.orm;

import java.io.Serializable;
import java.util.List;

import org.hibernate.LockMode;
import org.hibernate.Session;

import io.jee.medusa.orm.condition.Condition;
import io.jee.medusa.orm.condition.CountCondition;
import io.jee.medusa.orm.pager.output.OutputPager;
import io.jee.medusa.orm.pager.support.ConditionSupport;

public interface DaoSupport<T> {
	
	Session getSession();
	
	/**
	 * 保存实体对象
	 * @param entity
	 * @return 主键值
	 */
	Serializable save(T entity);
	
	void saveOrUpdate(T entity);
	
	/**
	 * 删除实体对象
	 * @param entity
	 */
	void delete(T entity);
	
	/**
	 * 根据条件删除
	 * @param key
	 * @param value
	 * @return
	 */
	int delete(String key, Object value);
	
	/**
	 * 根据条件删除
	 * @param key
	 * @param values
	 * @return
	 */
	int delete(String key, Object[] values);

	void update(T entity);
	
	void update(T entity, LockMode lockMode);
	
	/**
	 * 根据条件修改
	 * @param key
	 * @param value
	 * @param id 主键值
	 */
	void update(String key, Object value, Serializable id);
	
	void update(String key, Object value, Serializable[] ids);
	
	T get(Serializable id);
	
	T get(Serializable id, LockMode lockMode);
	
	T load(Serializable id);
	
	T unique(String key, Object value);
	
	T unique(String key, Object value, LockMode lockMode);
	
	Serializable unique(String key, Object value, String fieldName);
	
	Serializable unique(String key, Object value, String fieldName, LockMode lockMode);
	
	Serializable maxId(LockMode lockMode);
	
	List<T> list(String key, Object value);
	
	List<T> listJoin(String key, Object value, String joinField);
	
	/**
	 * 一个关键字多个值in条件查询集合
	 * @param key
	 * @param values
	 * @return
	 */
	List<T> list(String key, Object[] values);
	
	List<T> list(int size);
	
	List<T> listAll();
	
	long count(String key, Object value);
	
	long count(String key, Object value, LockMode lockMode);
	
	long countAll();
	
	<P extends ConditionSupport> OutputPager<T> page(P condition);
	
	Condition<T> condition();
	
	CountCondition<T> countCondition();
	
}
